iT邦幫忙

2024 iThome 鐵人賽

DAY 9
1
Mobile Development

用最接近自然語言的Basic30天學會行動App系列 第 9

Basic30天學會行動App-第9章.App使用Intent與Activity

  • 分享至 

  • xImage
  •  

第9章: 學習使用Intent與Activity

在行動應用程式開發中,Intent 和 Activity 是非常重要的概念。Intent 是用來在不同的 Activity 之間進行通訊和協作的工具,還可以用來啟動其他應用程式或系統功能。本章將深入探討 Intent 和 Activity 的基本概念,並通過範例程式展示如何在 B4A 中使用這些工具來實現應用程式的複雜互動。

Intent的基本概念

Intent 是 Android 開發中的一個關鍵概念,它代表著應用程式間或應用程式內部的動作意圖。Intent 可以用來執行多種操作,例如啟動新的 Activity、發送廣播消息,甚至調用系統服務。根據操作的不同,Intent 可以分為以下兩種類型:

  1. 明確Intent(Explicit Intent)
    明確 Intent 用來在應用程式內部啟動特定的 Activity。開發者可以明確指定要啟動的 Activity,並且可以傳遞資料給目標 Activity。
Sub btnOpenActivity_Click
    Dim intent As Intent
    intent.Initialize("","")
    intent.SetComponent("com.example.app/.NextActivity")
    StartActivity(intent)
End Sub

在這個範例中,我們使用明確 Intent 啟動了名為 NextActivity 的 Activity。SetComponent 方法指定了要啟動的 Activity,格式為「包名/Activity 名稱」。
2. 隱含Intent(Implicit Intent)
隱含 Intent 允許應用程式向系統發出一個一般性的動作請求,而系統會自動選擇合適的應用程式來處理這個請求。例如,打開一個網址或撥打電話都可以使用隱含 Intent。

Sub btnOpenBrowser_Click
    Dim intent As Intent
    intent.Initialize(intent.ACTION_VIEW, "https://www.b4x.com")
    StartActivity(intent)
End Sub

在這個範例中,隱含 Intent 用來打開一個網址,系統會自動選擇瀏覽器來執行這個操作。

Activity之間的通訊

在一個應用程式中,Activity 之間通常需要進行資料交換或通知彼此某些事件的發生。這通常通過 Intent 和 Bundle 來實現。

  1. 使用Intent傳遞資料
    當你啟動一個新的 Activity 時,經常需要傳遞一些資料給它。這可以通過在 Intent 中附加額外的資訊來實現。
Sub btnSendData_Click
    Dim intent As Intent
    intent.Initialize("","")
    intent.SetComponent("com.example.app/.DetailActivity")
    intent.PutExtra("username", "JohnDoe")
    intent.PutExtra("age", 30)
    StartActivity(intent)
End Sub

在這個範例中,我們使用 PutExtra 方法將 username 和 age 這兩個資訊傳遞給即將啟動的 Activity。
在接收端的 Activity 中,可以通過以下方式獲取這些資料:

Sub Activity_Create(FirstTime As Boolean)
    Dim username As String = Activity.GetStartingIntent.GetExtra("username")
    Dim age As Int = Activity.GetStartingIntent.GetExtra("age")
    
    Log("Username: " & username)
    Log("Age: " & age)
End Sub
  1. 使用Activity返回結果
    有時,一個 Activity 可能需要在完成任務後將結果返回給啟動它的 Activity。這通常使用 StartActivityForResult 和 ActivityResult 來實現。
Sub btnStartForResult_Click
    Dim intent As Intent
    intent.Initialize("","")
    intent.SetComponent("com.example.app/.InputActivity")
    StartActivityForResult(intent)
End Sub

Sub Activity_Result (Result As Int, Intent As Intent)
    If Result = RESULT_OK Then
        Dim returnedData As String = Intent.GetExtra("inputData")
        Log("Returned Data: " & returnedData)
    End If
End Sub

在這個範例中,StartActivityForResult 方法用來啟動 InputActivity,並等待其返回結果。當 InputActivity 完成後,可以通過 Intent 傳回資料給原本的 Activity。
在 InputActivity 中,可以通過以下方式返回結果:

Sub btnSubmit_Click
    Dim intent As Intent
    intent.Initialize("", "")
    intent.PutExtra("inputData", "User input data")
    Activity.SetResult(RESULT_OK, intent)
    Activity.Finish
End Sub

這樣,在 InputActivity 完成任務後,它會將輸入資料返回給原本啟動它的 Activity。

啟動其他App或系統功能

Intent 也可以用來啟動其他應用程式或調用系統功能,這樣可以讓你的應用程式與設備上的其他應用和服務進行互動。

  1. 啟動其他應用程式
    你可以使用隱含 Intent 來啟動其他應用程式,例如撥打電話、發送電子郵件或查看地圖等。
Sub btnDialPhone_Click
    Dim intent As Intent
    intent.Initialize(intent.ACTION_DIAL, "tel:123456789")
    StartActivity(intent)
End Sub

這個範例中,我們使用 Intent 撥打電話。ACTION_DIAL 是 Android 提供的預定義動作,用來調用系統的撥號介面。
2. 調用系統功能
你也可以使用 Intent 調用系統的功能,如打開相機、拍照、選擇照片等。

Sub btnTakePhoto_Click
    Dim intent As Intent
    intent.Initialize("android.media.action.IMAGE_CAPTURE", "")
    StartActivity(intent)
End Sub

在這個範例中,我們使用 Intent 啟動相機應用,讓用戶拍攝照片。拍攝完成後,照片將存儲在系統指定的存儲位置。
3. 接收其他應用的Intent
你的應用程式也可以設置為接收來自其他應用程式的 Intent。這樣,其他應用程式就可以將資料發送到你的應用程式中進行處理。

Sub Activity_Create(FirstTime As Boolean)
    Dim intent As Intent = Activity.GetStartingIntent
    If intent.Action = intent.ACTION_VIEW Then
        Dim data As String = intent.GetData
        Log("Received data: " & data)
    End If
End Sub

這段程式碼展示了如何在 Activity 中處理來自其他應用程式的 Intent。ACTION_VIEW 是常見的動作類型之一,通常用於處理資料的顯示或編輯。

範例程式:使用Intent與Activity實現應用程式間的互動

以下是一個完整的範例程式,展示了如何在 B4A 中使用 Intent 和 Activity 來實現應用程式之間的通訊和交互。

Sub Process_Globals
    ' 全域變數
End Sub

Sub Globals
    Dim btnSendData As Button
    Dim btnDialPhone As Button
    Dim lblResult As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("MainLayout")
    
    btnSendData.Text = "傳送資料到下一個Activity"
    btnDialPhone.Text = "撥打電話"
End Sub

Sub btnSendData_Click
    Dim intent As Intent
    intent.Initialize("","")
    intent.SetComponent("com.example.app/.DetailActivity")
    intent.PutExtra("username", "JohnDoe")
    intent.PutExtra("age", 30)
    StartActivity(intent)
End Sub

Sub btnDialPhone_Click
    Dim intent As Intent
    intent.Initialize(intent.ACTION_DIAL, "tel:123456789")
    StartActivity(intent)
End Sub

Sub Activity_Result (Result As Int, Intent As Intent)
    If Result = RESULT_OK Then
        Dim returnedData As String = Intent.GetExtra("inputData")
        lblResult.Text = "返回的資料: " & returnedData
    End If
End Sub

這個範例展示了如何使用 Intent 來傳遞資料和啟動其他應用程式功能。透過掌握 Intent 和 Activity 的使用技巧,你可以開發出功能強大且互動性高的行動應用程式。
參考網址
https://www.b4x.com/android/forum/


上一篇
Basic30天學會行動App-第8章.App處理輸入
下一篇
Basic30天學會行動App-第10章.App資料存取與儲存
系列文
用最接近自然語言的Basic30天學會行動App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言